package com.luu.game.service.impl;

import com.luu.game.constant.RareConstant;
import com.luu.game.dao.LevelExpDao;
import com.luu.game.data.dto.ElfInfoDTO;
import com.luu.game.data.dto.LevelExpDTO;
import com.luu.game.service.LevelExpService;
import com.luu.game.service.UserElfService;
import com.luu.game.service.logic.elfRareFactory.BaseElfRare;
import com.luu.game.service.logic.elfRareFactory.RareFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.validation.Valid;

@Service
public class LevelExpServiceImpl implements LevelExpService {

    @Autowired
    private LevelExpDao levelExpDao;
    @Autowired
    private UserElfService userElfService;

    @Override
    public void insertLevel(@Valid LevelExpDTO levelExpDTO) {
        levelExpDao.insertLevel(levelExpDTO);
    }

    @Override
    public void upLevel(Integer userElfId, Double exp) {
        ElfInfoDTO elfInfo = userElfService.findById(userElfId);

        // 判断是否升级，否的话则增加经验
        if (isUpLevel(elfInfo,exp)){
            elfInfo = updateLevelProperty(elfInfo);
            elfInfo.setExp(overflowExp(elfInfo, exp));
        }else{
            final Double overflowExp = overflowExp(elfInfo, exp);
            elfInfo.setExp(overflowExp);
        }
        userElfService.updateUserElfInfo(elfInfo);

    }

    @Override
    public boolean isUpLevel(ElfInfoDTO elfInfo, Double exp) {

        final Integer lv = elfInfo.getLv();
        // 等级超过100则不升级
        if (lv >= 100){
            return false;
        }
        final int nextLevel = elfInfo.getLv() + 1;
        final LevelExpDTO levelExp = levelExpDao.findByLevel(nextLevel);
        Double countElfExp = overflowExp(elfInfo, exp);
        boolean sign = (countElfExp >= levelExp.getExp()) ? true : false;

        if (sign){
            return true;
        }

        return false;
    }

    /**
     * 计算战斗经验 公式：敌人lv * 敌人基础经验 / 7
     * @param elfInfoDTO
     * @return
     */
    @Override
    public Double countCombatExp(ElfInfoDTO elfInfoDTO) {
        final Integer lv = elfInfoDTO.getLv();
        final Double baseExp = getBaseExp(elfInfoDTO.getRare());
        final double result = lv * baseExp / 7;
        return result;
    }

    /**
     * 获取基础经验值
     * @param rare
     * @return
     */
    private Double getBaseExp(String rare){
        if (RareConstant.A.equals(rare)){
            return RareConstant.A_BASE_EXP;
        }
        if (RareConstant.B.equals(rare)){
            return RareConstant.B_BASE_EXP;
        }
        if (RareConstant.C.equals(rare)){
            return RareConstant.C_BASE_EXP;
        }
        return 0.0;
    }

    /**
     * 计算现有经验值 + 溢出
     * @param elfInfo
     * @param exp
     * @return
     */
    private Double overflowExp(ElfInfoDTO elfInfo, Double exp){
        Double result = elfInfo.getExp() + exp;
        return result;
    }

    /**
     * 升级各项属性
     * @param elfInfoDTO
     * @return
     */
    private ElfInfoDTO updateLevelProperty(ElfInfoDTO elfInfoDTO){

        final BaseElfRare rare = new RareFactory(elfInfoDTO.getRare()).createElfRare();

        // 血量
        Double hp = rare.elfUpLevelHpValue(elfInfoDTO.getHp());
        // 攻击力
        Double atk = rare.elfUpLevelValue(elfInfoDTO.getAtk());
        // 防御力
        Double defense = rare.elfUpLevelValue(elfInfoDTO.getDefense());
        // 速度
        Double speed = rare.elfUpLevelValue(elfInfoDTO.getSpeed());
        // 新等级
        int newLev = elfInfoDTO.getLv() + 1;

        elfInfoDTO.setHp(hp);
        elfInfoDTO.setAtk(atk);
        elfInfoDTO.setDefense(defense);
        elfInfoDTO.setSpeed(speed);
        elfInfoDTO.setLv(newLev);

        return elfInfoDTO;
    }

}
